//设置输入源数量
#define D2D_INPUT_COUNT 1
//将输入源0 设置为简单采样模式
#define D2D_INPUT0_SIMPLE
//引入hlsl帮助程序
#include "d2d1effecthelpers.hlsli"

//定义属性
//源颜色 float(0,0,0)~float(1,1,1)
float3 sourceColor;
//替换后的颜色,hsv颜色 float(-1,-1,-1)~float(1,1,1)
float3 hsv;
//颜色容差 0~1
float threshold;

//HSV 到 RGB 转换
float3 hsv2rgb(float3 c)
{
    float3 rgb = clamp(abs(fmod(c.x * 6.0 + float3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
    float3 f1 = float3(1,1,1);
    return c.z * lerp(f1, rgb, float3(c.y,c.y,c.y));
}
//rgb到hsv 转换
float3 rgb2hsv(float3 c)
{
    float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
    float a = step(c.b, c.g);
    float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), float4(a,a,a,a));
    float b = step(p.x, c.r);
    float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), float4(b,b,b,b));
    float d = q.x - min(q.w, q.y);
    float e = 1.0e-10;
    return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}

//主程序
D2D_PS_ENTRY(main){
    //获取当前像素颜色
    float4 sColor = D2DGetInput(0);
    float3 color = sColor.rgb;
    //当前像素的每个分量减去输入颜色的对于分量的绝对值跟阈值做比较，查看是否符合条件
    if(abs(color.r - sourceColor.r) < threshold && abs(color.g - sourceColor.g) < threshold && abs(color.b - sourceColor.b) < threshold)
    {
        //将当前颜色从 rgb转到hsv
        float3 hsv = rgb2hsv(color);
        //声明 计算后的hsv 变量
        
        float3 thsv = float3(0,0,0);
        //虽然这里用的都是rgb属性，但是对应的是hsv
        //当前像素的hsv与输入的hsv相加
        thsv.r= fmod(hsv.r*360+hsv.r*360,360)/360.0;
        thsv.g= clamp(hsv.g+hsv.g,0,1);
        thsv.b= clamp(hsv.b+hsv.b,0,1);
        //将累计后的hsv 转换成rgb然后输出颜色
        float3 resultColor = hsv2rgb(thsv);  
        return float4(resultColor,sColor.a);
    }
    //不符合条件的像素，返回输入的颜色即可
    return sColor;
}

